/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controleur;

import com.opensymphony.xwork2.ActionSupport;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import modele.Etudie;
import modele.NewHibernateUtil;
import modele.Profession;
import org.apache.struts2.interceptor.SessionAware;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Aimee
 */
public class Statistique extends ActionSupport implements SessionAware {

    private Map<String, Object> session;
    public Session hibernateSession;
    public List<String> listeSalaireIksem = new ArrayList<String>();
    public List<String> listeSalaireMIAGE = new ArrayList<String>();
    public List<Etudie> listeEtu = new ArrayList<Etudie>();
    public List<String> listeAnnee = new ArrayList<String>();
    public List<Double> listePourcentageGarconIksem = new ArrayList<Double>();
    public List<Double> listePourcentageGarconMiage = new ArrayList<Double>();
    public List<Double> listePourcentageFilleIksem = new ArrayList<Double>();
    public List<Double> listePourcentageFilleMiage = new ArrayList<Double>();
    public List<Integer> listeMoyenneFilleIksem = new ArrayList<Integer>();
    public List<Integer> listeMoyenneFilleMiage = new ArrayList<Integer>();
    public List<Integer> listeMoyenneGarconMiage = new ArrayList<Integer>();
    public List<Integer> listeMoyenneGarconIksem = new ArrayList<Integer>();
    public List<Double> listeMoyenneEmbaucheIksem = new ArrayList<Double>();
    public List<Double> listeMoyenneEmbaucheMiage = new ArrayList<Double>();

    /**
     * @return the session
     */
    public Map<String, Object> getSession() {
        return session;
    }

    /**
     * @param session the session to set
     */
    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    public List<String> getListeAnneeCourante() throws Exception {
        setHibernateSession(NewHibernateUtil.getSessionFactory().openSession());
        getHibernateSession().beginTransaction();
        Calendar c = Calendar.getInstance();
        int annee = c.get(Calendar.YEAR);
        for (int y = annee - 5; y < annee; y++) {
            getListeAnnee().add(String.valueOf(y));
        }
        return getListeAnnee();
    }

    public String calculEmbauche() throws Exception {
        listeAnnee = getListeAnneeCourante();
        for (int i = 0; i < listeAnnee.size(); i++) {
            String annee = listeAnnee.get(i);
            listeEtu = getlisteEtudiant(Integer.valueOf(annee), "M2 IKSEM");
            listeMoyenneEmbaucheIksem.add(getListeMoyenne(Integer.valueOf(annee), listeEtu));
            listeEtu = getlisteEtudiant(Integer.valueOf(annee), "M2 MIAGE");
            listeMoyenneEmbaucheMiage.add(getListeMoyenne(Integer.valueOf(annee), listeEtu));
        }
        session.put("listeAnnee", listeAnnee);
        session.put("listeMoyenneEmbaucheIksem", listeMoyenneEmbaucheIksem);
        session.put("listeMoyenneEmbaucheMiage", listeMoyenneEmbaucheMiage);
        return "ok";
    }

    public double getListeMoyenne(int annee, List<Etudie> listeEt) throws Exception {

        double tot = 0.0;
        double moyenne = 0.0;
        if (listeEt != null) {
            for (int j = 0; j < listeEt.size(); j++) {
                double dureeChomage = 0.0;
                Set profession = listeEt.get(j).getPersonne().getProfessions();
                Iterator<Profession> it = profession.iterator();
                //Calcul de la profession qui suit l'année de fin d'étude de l'étudiant
                Profession professionMin = null;
                if (it.hasNext()) {
                    Profession prof1 = it.next();
                    int anneeProf1 = calculAnnee(prof1);
                    int moisProf1 = calculMois(prof1);
                    if (anneeProf1 >= annee && moisProf1 >= 9) {
                        professionMin = prof1;
                        while (it.hasNext()) {
                            int anneeProfMin = calculAnnee(professionMin);
                            int moidProMin = calculMois(professionMin);
                            Profession profAux = it.next();
                            int anneeDebutProfAux = calculAnnee(profAux);
                            int moisDebutProfAux = calculMois(profAux);
                            if (anneeDebutProfAux < anneeProfMin && annee < anneeDebutProfAux) {
                                professionMin = profAux;
                            } else if (anneeDebutProfAux == anneeProfMin && moisDebutProfAux < moidProMin) {
                                professionMin = profAux;
                            }
                        }
                    } else {
                        while (it.hasNext()) {
                            if (professionMin == null) {
                                Profession prof = it.next();
                                int anneeProf = calculAnnee(prof);
                                int moisProf = calculMois(prof);
                                if (anneeProf >= annee && moisProf >= 9) {
                                    professionMin = prof;
                                }
                            } else {
                                int anneeProfMin = calculAnnee(professionMin);
                                int moidProMin = calculMois(professionMin);
                                Profession profAux = it.next();
                                int anneeDebutProfAux = calculAnnee(profAux);
                                int moisDebutProfAux = calculMois(profAux);
                                if (anneeDebutProfAux < anneeProfMin && annee < anneeDebutProfAux) {
                                    professionMin = profAux;
                                } else if (anneeDebutProfAux == anneeProfMin && moisDebutProfAux < moidProMin) {
                                    professionMin = profAux;
                                }
                            }
                        }
                    }
                }
                if (professionMin == null) {
                    Date dateAujourdhui = new Date();
                    String dateFin = "01/09/" + annee;
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
                    Date date = simpleDateFormat.parse(dateFin);
                    dureeChomage = ((dateAujourdhui.getTime() - date.getTime()) / (24 * 60 * 60 * 1000)) / 31;
                } else {
                    String dateFin = "01/09/" + annee;
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
                    Date date = simpleDateFormat.parse(dateFin);
                    Date dateMin = professionMin.getDateDebut();
                    dureeChomage = ((dateMin.getTime() - date.getTime()) / (24 * 60 * 60 * 1000)) / 31;
                }
                moyenne += dureeChomage;
            }
            tot = moyenne / listeEt.size();
        }
        return tot;

    }

    public int calculAnnee(Profession profession) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
        String date = simpleDateFormat.format(profession.getDateDebut());
        return Integer.valueOf(date.substring(date.length() - 4, date.length()));
    }

    public int calculMois(Profession profession) {
        return profession.getDateDebut().getMonth() + 1;
    }

    public String moyenneSexe() throws Exception {
        listeAnnee = getListeAnneeCourante();
        for (int i = 0; i < listeAnnee.size(); i++) {
            listeEtu = getlisteEtudiant(Integer.valueOf(listeAnnee.get(i)), "M2 IKSEM");
            if (listeEtu != null) {
                int moyenneFille = calculNombreFille(listeEtu);
                int moyenneGarcon = calculNombreMec(listeEtu);
                listeMoyenneFilleIksem.add(moyenneFille);
                listeMoyenneGarconIksem.add(moyenneGarcon);
            }
            listeEtu = getlisteEtudiant(Integer.valueOf(listeAnnee.get(i)), "M2 MIAGE");
            if (listeEtu != null) {
                int moyenneFille = calculNombreFille(listeEtu);
                int moyenneGarcon = calculNombreMec(listeEtu);
                listeMoyenneFilleMiage.add(moyenneFille);
                listeMoyenneGarconMiage.add(moyenneGarcon);

            }
        }
        session.put("listeMoyenneFilleMiage", listeMoyenneFilleMiage);
        session.put("listeMoyenneGarconMiage", listeMoyenneGarconMiage);
        session.put("listeMoyenneFilleIksem", listeMoyenneFilleIksem);
        session.put("listeMoyenneGarconIksem", listeMoyenneGarconIksem);
        session.put("listeAnnee", getListeAnnee());
        return "ok";
    }

    public List<Etudie> getlisteEtudiant(int annee, String diplome) throws Exception {
        setHibernateSession(NewHibernateUtil.getSessionFactory().openSession());
        getHibernateSession().beginTransaction();
        String rep = "select pers from Etudie as pers where pers.promotion.diplome='" + diplome + "' and pers.promotion.anneeFin=" + annee;
        Query query = getHibernateSession().createQuery(rep);
        setListeEtu((List<Etudie>) query.list());
        return getListeEtu();
    }

    public String afficheStat() throws Exception {
        listeAnnee = getListeAnneeCourante();
        for (int i = 0; i < listeAnnee.size(); i++) {
            listeEtu  = getlisteEtudiant(Integer.valueOf(listeAnnee.get(i)), "M2 IKSEM");
            if (listeEtu != null) {
                Double sal = calculMoyenne(listeEtu);
                listeSalaireIksem.add(String.valueOf(sal));
            }
            listeEtu = getlisteEtudiant(Integer.valueOf(listeAnnee.get(i)), "M2 MIAGE");
            if (listeEtu != null) {
                Double sal = calculMoyenne(listeEtu);
                listeSalaireMIAGE.add(String.valueOf(sal));
            }
        }
        session.put("listeSalaireMIAGE", listeSalaireMIAGE);
        session.put("listeSalaireIksem", listeSalaireIksem);
        session.put("listeAnnee", getListeAnnee());

        return "ok";
    }

    public String statSexe() throws Exception {

        listeAnnee = getListeAnneeCourante();
        for (int i = 0; i < listeAnnee.size(); i++) {
            listeEtu = getlisteEtudiant(Integer.valueOf(listeAnnee.get(i)), "M2 IKSEM");
            if (listeEtu != null) {
                Double pourcentage = calculPourcentageFille(listeEtu);
                listePourcentageFilleIksem.add(pourcentage);
                listePourcentageGarconIksem.add(100 - pourcentage);

            }
            listeEtu = getlisteEtudiant(Integer.valueOf(listeAnnee.get(i)), "M2 MIAGE");
            if (listeEtu != null) {
                Double pourcentage = calculPourcentageFille(listeEtu);
                listePourcentageFilleMiage.add(pourcentage);
                listePourcentageGarconMiage.add(100 - pourcentage);
            }
        }
        session.put("listePourcentageFilleMiage", listePourcentageFilleMiage);
        session.put("listePourcentageFilleIksem", listePourcentageFilleIksem);
        session.put("listePourcentageGarconMiage", listePourcentageGarconMiage);
        session.put("listePourcentageGarconIksem", listePourcentageGarconIksem);
        session.put("listeAnnee", getListeAnnee());
        return "ok";
    }

    public double calculMoyenne(List<Etudie> listeEtu) {
        double sal = 0;
        for (int i = 0; i < listeEtu.size(); i++) {
            Double listeCrit = 0.0;
            Criteria crit = getHibernateSession().createCriteria(Profession.class);
            crit.add(Restrictions.eq("personne.idPersonne", listeEtu.get(i).getPersonne().getIdPersonne()));
            crit.setProjection(Projections.avg("salaire"));
            listeCrit = (Double) crit.uniqueResult();
            if (sal == 0) {
                sal = listeCrit;
            } else {
                if(listeCrit == null){
                    listeCrit = 0.0;
                }
                sal = (listeCrit + sal) / 2;
            }

        }
        return sal;
    }

    public double calculPourcentageFille(List<Etudie> listeEtu) {
        int nbEtudiant = listeEtu.size();
        int nbFille = calculNombreFille(listeEtu);
        double pourcentage = (100 * nbFille) / (nbEtudiant);
        return pourcentage;
    }

    public int calculNombreFille(List<Etudie> listeEtu) {
        int nbFille = 0;
        for (int i = 0; i < listeEtu.size(); i++) {
            if (listeEtu.get(i).getPersonne().getSexePersonne().equals("feminin")) {
                nbFille++;
            }
        }
        return nbFille;
    }

    public int calculNombreMec(List<Etudie> listeEtu) {
        int nbGarcon = 0;
        for (int i = 0; i < listeEtu.size(); i++) {
            if (listeEtu.get(i).getPersonne().getSexePersonne().equals("masculin")) {
                nbGarcon++;
            }
        }
        return nbGarcon;

    }

    /**
     * @return the hibernateSession
     */
    public Session getHibernateSession() {
        return hibernateSession;
    }

    /**
     * @param hibernateSession the hibernateSession to set
     */
    public void setHibernateSession(Session hibernateSession) {
        this.hibernateSession = hibernateSession;
    }

    /**
     * @return the listeSalaireIksem
     */
    public List<String> getListeSalaireIksem() {
        return listeSalaireIksem;
    }

    /**
     * @param listeSalaireIksem the listeSalaireIksem to set
     */
    public void setListeSalaireIksem(List<String> listeSalaireIksem) {
        this.listeSalaireIksem = listeSalaireIksem;
    }

    /**
     * @return the listeSalaireMIAGE
     */
    public List<String> getListeSalaireMIAGE() {
        return listeSalaireMIAGE;
    }

    /**
     * @param listeSalaireMIAGE the listeSalaireMIAGE to set
     */
    public void setListeSalaireMIAGE(List<String> listeSalaireMIAGE) {
        this.listeSalaireMIAGE = listeSalaireMIAGE;
    }

    /**
     * @return the listeEtu
     */
    public List<Etudie> getListeEtu() {
        return listeEtu;
    }

    /**
     * @param listeEtu the listeEtu to set
     */
    public void setListeEtu(List<Etudie> listeEtu) {
        this.listeEtu = listeEtu;
    }

    /**
     * @return the listeAnnee
     */
    public List<String> getListeAnnee() {
        return listeAnnee;
    }

    /**
     * @param listeAnnee the listeAnnee to set
     */
    public void setListeAnnee(List<String> listeAnnee) {
        this.listeAnnee = listeAnnee;
    }

    /**
     * @return the listePourcentageGarconIksem
     */
    public List<Double> getListePourcentageGarconIksem() {
        return listePourcentageGarconIksem;
    }

    /**
     * @param listePourcentageGarconIksem the listePourcentageGarconIksem to set
     */
    public void setListePourcentageGarconIksem(List<Double> listePourcentageGarconIksem) {
        this.listePourcentageGarconIksem = listePourcentageGarconIksem;
    }

    /**
     * @return the listePourcentageGarconMiage
     */
    public List<Double> getListePourcentageGarconMiage() {
        return listePourcentageGarconMiage;
    }

    /**
     * @param listePourcentageGarconMiage the listePourcentageGarconMiage to set
     */
    public void setListePourcentageGarconMiage(List<Double> listePourcentageGarconMiage) {
        this.listePourcentageGarconMiage = listePourcentageGarconMiage;
    }

    /**
     * @return the listePourcentageFilleIksem
     */
    public List<Double> getListePourcentageFilleIksem() {
        return listePourcentageFilleIksem;
    }

    /**
     * @param listePourcentageFilleIksem the listePourcentageFilleIksem to set
     */
    public void setListePourcentageFilleIksem(List<Double> listePourcentageFilleIksem) {
        this.listePourcentageFilleIksem = listePourcentageFilleIksem;
    }

    /**
     * @return the listePourcentageFilleMiage
     */
    public List<Double> getListePourcentageFilleMiage() {
        return listePourcentageFilleMiage;
    }

    /**
     * @param listePourcentageFilleMiage the listePourcentageFilleMiage to set
     */
    public void setListePourcentageFilleMiage(List<Double> listePourcentageFilleMiage) {
        this.listePourcentageFilleMiage = listePourcentageFilleMiage;
    }

    /**
     * @return the listeMoyenneFilleIksem
     */
    public List<Integer> getListeMoyenneFilleIksem() {
        return listeMoyenneFilleIksem;
    }

    /**
     * @param listeMoyenneFilleIksem the listeMoyenneFilleIksem to set
     */
    public void setListeMoyenneFilleIksem(List<Integer> listeMoyenneFilleIksem) {
        this.listeMoyenneFilleIksem = listeMoyenneFilleIksem;
    }

    /**
     * @return the listeMoyenneFilleMiage
     */
    public List<Integer> getListeMoyenneFilleMiage() {
        return listeMoyenneFilleMiage;
    }

    /**
     * @param listeMoyenneFilleMiage the listeMoyenneFilleMiage to set
     */
    public void setListeMoyenneFilleMiage(List<Integer> listeMoyenneFilleMiage) {
        this.listeMoyenneFilleMiage = listeMoyenneFilleMiage;
    }

    /**
     * @return the listeMoyenneGarconMiage
     */
    public List<Integer> getListeMoyenneGarconMiage() {
        return listeMoyenneGarconMiage;
    }

    /**
     * @param listeMoyenneGarconMiage the listeMoyenneGarconMiage to set
     */
    public void setListeMoyenneGarconMiage(List<Integer> listeMoyenneGarconMiage) {
        this.listeMoyenneGarconMiage = listeMoyenneGarconMiage;
    }

    /**
     * @return the listeMoyenneGarconIksem
     */
    public List<Integer> getListeMoyenneGarconIksem() {
        return listeMoyenneGarconIksem;
    }

    /**
     * @param listeMoyenneGarconIksem the listeMoyenneGarconIksem to set
     */
    public void setListeMoyenneGarconIksem(List<Integer> listeMoyenneGarconIksem) {
        this.listeMoyenneGarconIksem = listeMoyenneGarconIksem;
    }

    /**
     * @return the listeMoyenneEmbaucheIksem
     */
    public List<Double> getListeMoyenneEmbaucheIksem() {
        return listeMoyenneEmbaucheIksem;
    }

    /**
     * @param listeMoyenneEmbaucheIksem the listeMoyenneEmbaucheIksem to set
     */
    public void setListeMoyenneEmbaucheIksem(List<Double> listeMoyenneEmbaucheIksem) {
        this.listeMoyenneEmbaucheIksem = listeMoyenneEmbaucheIksem;
    }

    /**
     * @return the listeMoyenneEmbaucheMiage
     */
    public List<Double> getListeMoyenneEmbaucheMiage() {
        return listeMoyenneEmbaucheMiage;
    }

    /**
     * @param listeMoyenneEmbaucheMiage the listeMoyenneEmbaucheMiage to set
     */
    public void setListeMoyenneEmbaucheMiage(List<Double> listeMoyenneEmbaucheMiage) {
        this.listeMoyenneEmbaucheMiage = listeMoyenneEmbaucheMiage;
    }
}